package com.rao.gmall.order.mq;

import com.rabbitmq.client.Channel;
import com.rao.gmall.mq.RabbitConst;
import com.rao.gmall.order.service.OrderInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @author nzmxfan
 * @create 2021-08-22-15:27
 */
@Slf4j
@Service
public class OrderMessageConsumer {

    @Autowired
    OrderInfoService orderInfoService;

    /**
     * Message message,： 代表消息
     * Channel channel：消息的通道
     * 订单id   上次没处理完成的，MQ不会再把消息继续交个我们
     *
     * @param message
     * @param channel
     */
    @RabbitListener(queues = RabbitConst.ORDER_RELEASE_QUEUE)
    public void closeOrder(Message message, Channel channel, Long orderId) throws IOException {
        System.out.println("收到释放订单的消息：" + orderId);
        // 获取到 mq 发来的消息属性
        MessageProperties messageProperties = message.getMessageProperties();
        long deliveryTag = messageProperties.getDeliveryTag();
        // redelivered是true，说明这个消息是重新发来的
        Boolean redelivered = messageProperties.getRedelivered();
        System.out.println("redelivered：" + redelivered);
        try {
            // 关单处理
            orderInfoService.closeOrder(orderId);
            System.out.println(orderId + "：关单完成");
            //幂等性。
//            if(redelivered){
//                log.info("由于系统原因，{}订单关单消息，重复投递进来",orderId);
//            }else {
//
//            }
            // 业务正常处理。回复处理完成
            // 回复消息已经处理
            channel.basicAck(deliveryTag, false);
        } catch (IOException e) {
            channel.basicNack(deliveryTag, false, true);
        }
    }

}
